<template>
  <v-container class="sentiment-page" fluid>
    <v-row justify="center">
      <v-col cols="12">
        <v-card class="pa-8 sentiment-card" elevation="10">
          <div class="text-center mb-6">
            <h2 class="sentiment-title">评论感情分析</h2>
            <div class="sentiment-subtitle">基于深度学习LSTM模型</div>
          </div>
          <v-form>
            <v-textarea
              v-model="info"
              color="teal"
              outlined
              rows="4"
              label="请输入要分析的评论内容"
              class="mb-4"
            />
            <v-alert
              color="teal lighten-4"
              border="left"
              colored-border
              icon="mdi-information-outline"
              class="mb-4"
              dense
            >
              算法说明：该模块评论分析使用深度学习LSTM算法模型实现。
            </v-alert>
            <div class="d-flex justify-center mb-6">
              <v-btn
                color="primary"
                class="mr-4 px-10 py-3"
                @click="predict"
                :disabled="progress"
                :loading="progress"
                large
                elevation="2"
              >
                <v-icon left>mdi-robot</v-icon>
                分析
              </v-btn>
              <v-btn
                color="grey lighten-1"
                outlined
                class="px-10 py-3"
                type="reset"
                @click.prevent="resetForm"
                large
              >
                取消
              </v-btn>
            </div>
          </v-form>
          <v-dialog
            v-model="progress"
            hide-overlay
            persistent
            width="300"
          >
            <v-card color="teal" dark>
              <v-card-text>
                深度学习分析评论中，请稍等...
                <v-progress-linear indeterminate color="purple" class="mb-0"></v-progress-linear>
              </v-card-text>
            </v-card>
          </v-dialog>
          <transition name="fade">
            <v-alert
              v-if="alert"
              :color="resultColor"
              dark
              border="top"
              :icon="resultIcon"
              class="sentiment-result-alert mt-6 text-center"
            >
              <div class="result-label mb-2">
                <span>分析结果：</span>
                <span v-if="resultLabel=='positive'" class="result-positive">好评 <v-icon color="green">mdi-thumb-up</v-icon></span>
                <span v-else-if="resultLabel=='neutral'" class="result-neutral">中评 <v-icon color="orange">mdi-emoticon-neutral-outline</v-icon></span>
                <span v-else-if="resultLabel=='negative'" class="result-negative">差评 <v-icon color="red">mdi-thumb-down</v-icon></span>
              </div>
              <div class="result-score mb-3">概率 <span class="font-weight-bold">{{ score }}</span></div>
              <v-btn color="white" class="result-close-btn" @click="alert=false" small>关闭</v-btn>
            </v-alert>
          </transition>
        </v-card>
      </v-col>
    </v-row>
  </v-container>
</template>

<script>
import { mdiAlertOutline, mdiCloudUploadOutline, mdiEmoticonNeutralOutline, mdiThumbUp, mdiThumbDown, mdiEmoticonHappyOutline } from '@mdi/js'
import mixin from "../../mixins/mixins";
import {senti_single} from "../../api/machinelearning";

// 扩展好评/差评情感词词库
const POSITIVE_WORDS = [
  '好', '棒', '喜欢', '赞', '优秀', '精彩', '感动', '推荐', '值得', '满意',
  '惊喜', '感人', '温馨', '震撼', '美好', '出色', '完美', '佳作', '高分', '力荐',
  '经典', '牛', '强烈', '佩服', '感激', '愉快', '开心', '幸福', '治愈', '舒服',
  '乐观', '正能量', '美丽', '漂亮', '帅', '可爱', '有趣', '幽默', '感兴趣', '喜欢',
  '赞美', '喜欢', '喜欢', '喜欢', '爱', '安心', '宝贵', '超赞', '沉醉', '称心', '崇拜', '传奇', '纯粹', '聪慧',
  '大方', '带劲', '典雅', '动人', '独特', '非凡', '丰盛', '风光', '奉献', '高贵',
  '鼓舞', '乖巧', '光明', '过人', '豪迈', '和谐', '宏亮', '华丽', '欢畅', '辉煌',
  '豁达', '活力', '机智', '极致', '坚定', '健壮', '杰出', '解压', '进取', '惊艳',
  '敬仰', '绝妙', '开朗', '可靠', '可贵', '快乐', '宽心', '浪漫', '理想', '亮眼',
  '流畅', '满足', '迷人', '敏锐', '明快', '难得', '难忘', '能人', '浓厚', '澎湃',
  '品质', '平和', '奇妙', '气派', '强大', '亲切', '清澈', '倾心', '热情', '仁慈',
  '荣耀', '飒爽', '闪耀', '神奇', '神圣', '生机', '盛宴', '实力', '舒心', '爽快',
  '硕果', '踏实', '天赋', '甜蜜', '贴心', '通透', '完美', '顽强', '威风', '温暖',
  '无忧', '希望', '喜悦', '细腻', '祥和', '潇洒', '心动', '信赖', '兴旺', '幸运',
  '雅致', '一流', '宜人', '义气', '优雅', '愉悦', '珍贵', '真诚', '震撼', '正直',
  '知性', '智慧', '忠诚', '专注', '卓越', '自在', '尊贵', '昂扬', '榜样', '宝藏',
  '奔放', '便捷', '不凡', '灿烂', '超值', '沉浸', '诚信', '宠爱', '纯粹', '大气',
  '得体', '地道', '颠覆', '动听', '独特', '繁荣', '非凡', '丰富', '风采', '奉献',
  '感动', '高级', '革新', '公道', '共鸣', '鼓舞', '关爱', '光彩', '豪情', '和谐',
  '恢弘', '积极', '激情', '机智', '坚实', '简洁', '健康', '杰出', '解放', '进取',
  '精致', '敬爱', '绝佳', '开创', '可靠', '可爱', '快乐', '宽敞', '浪漫', '理想',
  '亮丽', '流畅', '满意', '美妙', '敏捷', '明朗', '难得', '难忘', '能干', '浓厚',
  '蓬勃', '平衡', '奇妙', '气概', '强大', '亲切', '清澈', '倾慕', '热情', '仁慈',
  '荣耀', '飒爽', '闪耀', '神奇', '神圣', '生机', '盛大', '实用', '舒畅', '爽朗',
  '硕大', '踏实', '天才', '甜美', '体贴', '通透', '完美', '顽强', '威风', '温馨',
  '无忧', '喜爱', '喜悦', '细腻', '祥和', '潇洒', '心动', '信赖', '兴旺', '幸运',
  '雅致', '一流', '宜人', '义气', '优雅', '愉悦', '珍贵', '真诚', '震撼', '正直',
  '知性', '智慧', '忠诚', '专注', '卓越', '自在', '尊贵', '昂扬', '榜样', '宝藏',
  '奔放', '便捷', '不凡', '灿烂', '超值', '沉浸', '诚信', '宠爱', '纯粹', '大气',
  '得体', '地道', '颠覆', '动听', '独特', '繁荣', '非凡', '丰富', '风采', '奉献',
  '感动', '高级', '革新', '公道', '共鸣', '鼓舞', '关爱', '光彩', '豪情', '和谐',
  '恢弘', '积极', '激情', '机智', '坚实', '简洁', '健康', '杰出', '解放', '进取',
  '精致', '敬爱', '绝佳', '开创', '可靠', '可爱', '快乐', '宽敞', '浪漫', '理想',
  '亮丽', '流畅', '满意', '美妙', '敏捷', '明朗', '难得', '难忘', '能干', '浓厚',
  '蓬勃', '平衡', '奇妙', '气概', '强大', '亲切', '清澈', '倾慕', '热情', '仁慈',
  '荣耀', '飒爽', '闪耀', '神奇', '神圣', '生机', '盛大', '实用', '舒畅', '爽朗',
  '硕大', '踏实', '天才', '甜美', '体贴', '通透', '完美', '顽强', '威风', '温馨',
  '无忧', '喜爱', '喜悦', '细腻', '祥和', '潇洒', '心动', '信赖', '兴旺', '幸运',
  '雅致', '一流', '宜人', '义气', '优雅', '愉悦', '珍贵', '真诚', '震撼', '正直',
  '知性', '智慧', '忠诚', '专注', '卓越', '自在', '尊贵'
];

const NEGATIVE_WORDS = [
  '差', '烂', '失望', '无聊', '难看', '垃圾', '糟糕', '尴尬', '失策', '失败',
  '不值', '遗憾', '难受', '生气', '愤怒', '讨厌', '恶心', '崩溃', '难以接受', '吐槽',
  '黑', '差劲', '糟心', '难顶', '不推荐', '不喜欢', '不满意', '失落', '难受', '痛苦',
  '烦', '气愤', '糟糕', '烂片', '烂剧', '烂人', '烂作', '烂尾', '烂到', '烂得',
  '烂死', '烂透', '烂爆', '烂片', '烂剧', '烂人', '烂作', '烂尾',
  '癌', '暗黑', '傲慢', '霸道', '败坏', '悲惨', '卑劣', '崩溃', '鄙视', '变态',
  '憋屈', '病态', '剥削', '不堪', '残酷', '残忍', '操蛋', '嘈杂', '差评', '谄媚',
  '猖狂', '嘲讽', '沉重', '痴呆', '耻辱', '冲突', '丑陋', '出卖', '出戏', '穿帮',
  '蠢货', '刺耳', '粗俗', '挫败', '打压', '呆板', '怠慢', '低劣', '低落', '地狱',
  '刁难', '掉价', '丢人', '毒瘤', '毒舌', '恶心', '噩梦', '烦人', '反胃', '放纵',
  '废物', '浮躁', '腐败', '负分', '负能量', '该死', '干扰', '膈应', '孤立', '固执',
  '怪癖', '官僚', '鬼畜', '害人', '寒心', '好假', '黑暗', '黑洞', '哄骗', '后悔',
  '忽悠', '糊涂', '滑稽', '坏蛋', '荒诞', '荒谬', '慌张', '谎言', '晦气', '混乱',
  '混账', '火大', '讥讽', '嫉妒', '计较', '奸诈', '煎熬', '僵硬', '狡诈', '叫嚣',
  '结巴', '绝望', '看不起', '可恶', '坑爹', '枯燥', '夸大', '垃圾', '懒惰', '烂俗',
  '浪费', '牢骚', '老套', '离谱', '理亏', '劣势', '劣质', '吝啬', '零分', '流氓',
  '漏洞', '露骨', '啰嗦', '落后', '麻痹', '麻烦', '骂人', '卖弄', '盲目', '毛躁',
  '矛盾', '没救', '闷骚', '蒙骗', '迷失', '蔑视', '敏感', '名不副实', '命苦', '抹黑',
  '脑残', '闹心', '腻烦', '扭曲', '懦弱', '排斥', '叛徒', '骗子', '偏心', '贫乏',
  '平庸', '破灭', '凄惨', '歧视', '牵强', '浅薄', '强求', '怯懦', '侵害', '轻浮',
  '轻视', '取笑', '圈套', '缺德', '缺陷', '惹祸', '任性', '日狗', '弱爆', '弱智',
  '骚扰', '傻逼', '煽动', '伤心', '上火', '奢靡', '神烦', '神经', '生硬', '失望',
  '失误', '事故', '势利', '受骗', '束缚', '刷屏', '双标', '水军', '俗气', '损害',
  '索取', '塌方', '贪婪', '逃避', '套路', '讨厌', '挑剔', '挑衅', '停滞', '痛苦',
  '偷工减料', '偷懒', '吐槽', '吐血', '颓废', '拖沓', '脱粉', '挖苦', '歪曲', '外行',
  '顽固', '妄为', '危机', '虚伪', '虚伪', '嫌弃', '险恶', '陷害', '嚣张', '小气',
  '泄气', '心寒', '心机', '心虚', '凶残', '虚伪', '絮叨', '玄学', '炫耀', '压抑',
  '厌世', '谣言', '要命', '野蛮', '依赖', '阴谋', '瘾君子', '庸俗', '油腻', '幼稚',
  '愚蠢', '愚昧', '郁闷', '造假', '渣男', '渣女', '诈骗', '战五渣', '折磨', '真香',
  '争执', '支吾', '智障', '中二', '重口', '猪队友', '专横', '装逼', '追悔', '自大',
  '自闭', '自负', '自私', '作死', '癌', '暗黑', '傲慢', '霸道', '败坏', '悲惨',
  '卑劣', '崩溃', '鄙视', '变态', '憋屈', '病态', '剥削', '不堪', '残酷', '残忍',
  '操蛋', '嘈杂', '差评', '谄媚', '猖狂', '嘲讽', '沉重', '痴呆', '耻辱', '冲突',
  '丑陋', '出卖', '出戏', '穿帮', '蠢货', '刺耳', '粗俗', '挫败', '打压', '呆板',
  '怠慢', '低劣', '低落', '地狱', '刁难', '掉价', '丢人', '毒瘤', '毒舌', '恶心',
  '噩梦', '烦人', '反胃', '放纵', '废物', '浮躁', '腐败', '负分', '负能量', '该死',
  '干扰', '膈应', '孤立', '固执', '怪癖', '官僚', '鬼畜', '害人', '寒心', '好假',
  '黑暗', '黑洞', '哄骗', '后悔', '忽悠', '糊涂', '滑稽', '坏蛋', '荒诞', '荒谬',
  '慌张', '谎言', '晦气', '混乱', '混账', '火大', '讥讽', '嫉妒', '计较', '奸诈',
  '煎熬', '僵硬', '狡诈', '叫嚣', '结巴', '绝望', '看不起', '可恶', '坑爹', '枯燥',
  '夸大', '垃圾', '懒惰', '烂俗', '浪费', '牢骚', '老套', '离谱', '理亏', '劣势',
  '劣质', '吝啬', '零分', '流氓', '漏洞', '露骨', '啰嗦', '落后', '麻痹', '麻烦',
  '骂人', '卖弄', '盲目', '毛躁', '矛盾', '没救', '闷骚', '蒙骗', '迷失', '蔑视',
  '敏感', '名不副实', '命苦', '抹黑', '脑残', '闹心', '腻烦', '扭曲', '懦弱', '排斥',
  '叛徒', '骗子', '偏心', '贫乏', '平庸', '破灭', '凄惨', '歧视', '牵强', '浅薄',
  '强求', '怯懦', '侵害', '轻浮', '轻视', '取笑', '圈套', '缺德', '缺陷', '惹祸',
  '任性', '日狗', '弱爆', '弱智', '骚扰', '傻逼', '煽动', '伤心', '上火', '奢靡',
  '神烦', '神经', '生硬', '失望', '失误', '事故', '势利', '受骗', '束缚', '刷屏',
  '双标', '水军', '俗气', '损害', '索取', '塌方', '贪婪', '逃避', '套路', '讨厌',
  '挑剔', '挑衅', '停滞', '痛苦', '偷工减料', '偷懒', '吐槽', '吐血', '颓废', '拖沓',
  '脱粉', '挖苦', '歪曲', '外行', '顽固', '妄为', '危机', '虚伪', '虚伪', '嫌弃',
  '险恶', '陷害', '嚣张', '小气', '泄气', '心寒', '心机', '心虚', '凶残', '虚伪',
  '絮叨', '玄学', '炫耀', '压抑', '厌世', '谣言', '要命', '野蛮', '依赖', '阴谋',
  '瘾君子', '庸俗', '油腻', '幼稚', '愚蠢', '愚昧', '郁闷', '造假', '渣男', '渣女',
  '诈骗', '战五渣', '折磨', '真香', '争执', '支吾', '智障', '中二', '重口', '猪队友',
  '专横', '装逼', '追悔', '自大', '自闭', '自负', '自私', '作死'
];

function containsAnyWord(text, wordList) {
  return wordList.some(word => text.includes(word));
}

export default {
  mixins: [mixin],
  data : () => ({
    info: "",
    progress: false,
    icons: {
      mdiAlertOutline,
      mdiCloudUploadOutline,
      mdiEmoticonNeutralOutline,
      mdiThumbUp,
      mdiThumbDown,
      mdiEmoticonHappyOutline
    },
    alert: false,
    resultLabel: '',
    score: 0,
  }),
  computed: {
    resultColor() {
      if (this.resultLabel === 'positive') return 'purple lighten-2';
      if (this.resultLabel === 'neutral') return 'orange lighten-2';
      if (this.resultLabel === 'negative') return 'purple lighten-2';
      return 'purple lighten-2';
    },
    resultIcon() {
      if (this.resultLabel === 'positive') return 'mdi-emoticon-happy-outline';
      if (this.resultLabel === 'neutral') return 'mdi-emoticon-neutral-outline';
      if (this.resultLabel === 'negative') return 'mdi-emoticon-sad-outline';
      return 'mdi-emoticon-happy-outline';
    }
  },
  methods:{
    predict(){
      if(this.info==""){
        this.$snackbar({content: '请先输入评论内容', top:true, center:true, color:'red',multiLine: true})
        return
      }
      this.progress = true
      const form = {"data" :this.info}
      senti_single(form).then((res)=>{
        this.progress = false
        const prob = res.data.data[0].prob;
        this.score = (prob * 100).toFixed(2) + '%';
        // 情感词辅助规则
        const hasPositive = containsAnyWord(this.info, POSITIVE_WORDS);
        const hasNegative = containsAnyWord(this.info, NEGATIVE_WORDS);
        if (!hasPositive && !hasNegative) {
          this.resultLabel = 'neutral';
        } else if (prob >= 0.75) {
          this.resultLabel = 'positive';
        } else if (prob < 0.35) {
          this.resultLabel = 'negative';
        } else {
          this.resultLabel = 'neutral';
        }
        this.alert = true;
      })
    },
    resetForm() {
      this.info = '';
      this.alert = false;
      this.resultLabel = '';
      this.score = 0;
    }
  },
}
</script>

<style scoped>
.sentiment-page {
  background: #181818;
  min-height: 100vh;
  padding-top: 40px;
  padding-bottom: 40px;
}
.sentiment-card {
  border-radius: 18px;
  box-shadow: 0 8px 32px rgba(0,0,0,0.18);
  background: #23272f;
  max-width: 1200px;
  margin: 0 auto;
}
.sentiment-title {
  color: #2dd4bf;
  font-size: 2.3rem;
  font-weight: bold;
  letter-spacing: 2px;
}
.sentiment-subtitle {
  color: #aaa;
  font-size: 1.2rem;
  margin-top: 4px;
}
.sentiment-result-alert {
  font-size: 1.4rem;
  border-radius: 12px;
  padding: 40px 24px 24px 24px;
  margin-bottom: 0;
}
.result-label {
  font-size: 1.35rem;
  font-weight: 500;
}
.result-positive {
  color: #00e676;
  font-weight: bold;
}
.result-neutral {
  color: #ff9800;
  font-weight: bold;
}
.result-negative {
  color: #ff5252;
  font-weight: bold;
}
.result-score {
  font-size: 1.15rem;
  color: #fff;
}
.result-close-btn {
  margin-top: 10px;
  color: #7c3aed !important;
}
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.4s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>
